/*-
* See the file LICENSE for redistribution information.
*
* Copyright (c) 2002-2006
* Sleepycat Software. All rights reserved.
*
* $Id: LatchTable.java,v 1.1 2006/05/06 09:00:35 ckaestne Exp $
*/
package com.sleepycat.je.latch;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.WeakHashMap;
/**
* Table of latches by thread for debugging.
*/
class LatchTable {
private String tableName;
private Map latchesByThread;
LatchTable(String tableName) {
this.tableName = tableName;
latchesByThread = Collections.synchronizedMap(new WeakHashMap());
}
/**
* Only call under the assert system. This records latching by thread.
*/
boolean noteLatch(Object latch)
throws LatchException {
Thread cur = Thread.currentThread();
Set threadLatches = (Set) latchesByThread.get(cur);
if (threadLatches == null) {
threadLatches = new HashSet();
latchesByThread.put(cur, threadLatches);
}
threadLatches.add(latch);
return true;
}
/**
* Only call under the assert system. This records latching by thread.
* @return true if unnoted successfully.
*/
boolean unNoteLatch(Object latch, String name) {
Thread cur = Thread.currentThread();
Set threadLatches = (Set) latchesByThread.get(cur);
if (threadLatches == null) {
return false;
} else {
return threadLatches.remove(latch);
}
}
/**
* Only call under the assert system. This counts held latches.
*/
int countLatchesHeld() {
Thread cur = Thread.currentThread();
Set threadLatches = (Set) latchesByThread.get(cur);
if (threadLatches != null) {
return threadLatches.size();
} else {
return 0;
}
}
String latchesHeldToString() {
Thread cur = Thread.currentThread();
Set threadLatches = (Set) latchesByThread.get(cur);
StringBuffer sb = new StringBuffer();
if (threadLatches != null) {
Iterator i = threadLatches.iterator();
while (i.hasNext()) {
sb.append(i.next()).append('\n');
}
}
return sb.toString();
}
void clearNotes() {
latchesByThread.clear();
}
/**
* For concocting exception messages.
*/
String getNameString(String name) {
StringBuffer sb = new StringBuffer(tableName);
if (name != null) {
sb.append("(").append(name).append(")");
}
return sb.toString();
}
/**
* Formats a latch owner and waiters.
*/
String toString(String name, Object owner, List waiters, int startIndex) {
/* Assume the caller does synchronization. */
StringBuffer sb = new StringBuffer();
sb.append("<LATCH ");
if (name != null) {
sb.append("[name: ").append(name).append("] ");
}
sb.append("[owner: ").append(owner).append("]");
if (waiters != null && waiters.size() > startIndex) {
sb.append(" [waiters: ");
for (int i = startIndex; i < waiters.size(); i++) {
sb.append(waiters.get(i)).append(" ");
}
sb.append("]");
}
sb.append(">");
return sb.toString();
}
}